package com.example.demo.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;


@Component
public class RedisUtils {

    private final RedisTemplate<String, Object> redisTemplate;

    public RedisUtils(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
//////////////////////////// String 操作 ////////////////////////////

    /**
     * 设置字符串值
     *
     * @param key    键
     * @param value  值
     * @param expire 过期时间（秒，0表示不设置）
     */
    public void setString(String key, Object value, long expire) {
        if (expire > 0) {
            redisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS);
        } else {
            redisTemplate.opsForValue().set(key, value);
        }
    }

    /**
     * 获取字符串值
     *
     * @param key 键
     * @return 值
     */
    public Object getString(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    //////////////////////////// Hash 操作 ////////////////////////////

    /**
     * 设置哈希字段值
     *
     * @param key   键
     * @param field 字段
     * @param value 值
     */
    public void hPut(String key, String field, Object value) {
        redisTemplate.opsForHash().put(key, field, value);
    }

    /**
     * 获取哈希所有字段和值
     *
     * @param key 键
     * @return Map<字段, 值>
     */
    public Map<Object, Object> hGetAll(String key) {
        return redisTemplate.opsForHash().entries(key);
    }

    //////////////////////////// List 操作 ////////////////////////////

    /**
     * 左插入列表
     *
     * @param key   键
     * @param value 值
     * @return 列表长度
     */
    public Long lPush(String key, Object value) {
        return redisTemplate.opsForList().leftPush(key, value);
    }

    /**
     * y右插入列表
     *
     * @param key
     * @param value
     * @return java.lang.Long
     */
    public Long rPush(String key, Object value) {
        return redisTemplate.opsForList().rightPush(key, value);
    }

    /**
     * 左弹出列表元素
     *
     * @param key 键
     * @return 弹出的值
     */
    public Object lPop(String key) {
        return redisTemplate.opsForList().leftPop(key);
    }

    /**
     * 右弹出列表元素
     *
     * @param key 键
     * @return 弹出的值
     */
    public Object rPop(String key) {
        return redisTemplate.opsForList().rightPop(key);
    }

    //////////////////////////// Set 操作 ////////////////////////////

    /**
     * 添加集合元素
     *
     * @param key    键
     * @param values 值数组
     * @return 成功添加的数量
     */
    public Long sAdd(String key, Object... values) {
        return redisTemplate.opsForSet().add(key, values);
    }

    /**
     * 获取集合所有元素
     *
     * @param key 键
     * @return Set<元素>
     */
    public Set<Object> sMembers(String key) {
        return redisTemplate.opsForSet().members(key);
    }

    //////////////////////////// ZSet 操作 ////////////////////////////

    /**
     * 添加有序集合元素（带权重）
     *
     * @param key   键
     * @param value 值
     * @param score 权重
     * @return 是否成功
     */
    public Boolean zAdd(String key, Object value, double score) {
        return redisTemplate.opsForZSet().add(key, value, score);
    }

    /**
     * 获取有序集合范围元素
     *
     * @param key   键
     * @param start 起始索引
     * @param end   结束索引
     * @return Set<元素>
     */
    public Set<Object> zRange(String key, long start, long end) {
        return redisTemplate.opsForZSet().range(key, start, end);
    }

    //////////////////////////// 通用操作 ////////////////////////////

    /**
     * 删除键
     *
     * @param key 键
     */
    public void delete(String key) {
        redisTemplate.delete(key);
    }

    /**
     * 设置过期时间
     *
     * @param key     键
     * @param seconds 秒数
     */
    public void expire(String key, long seconds) {
        redisTemplate.expire(key, seconds, TimeUnit.SECONDS);
    }
}